package main
import "fmt"

// 多态

// 接口（本质是指针）
type AnimalIF interface{
	Sleep()
	GetColor() string
	GetType() string
}
// 实现类
type Cat struct{
	color string // 颜色
}

// 实现接口
// 注意：如果没有实现接口中的所有方法，则不视为实现接口
func (this *Cat) Sleep(){
	fmt.Println("cat sleep...")
}

func (this *Cat) GetColor() string{
	return fmt.Sprintf("this is %s",this.color)
}

func (this *Cat) GetType() string{
	return "cat"
}

type Dog struct{
	color string
}

func (this *Dog) Sleep(){
	fmt.Println("cat sleep...")
}

func (this *Dog) GetColor() string{
	return fmt.Sprintf("this is %s",this.color)
}

func (this *Dog) GetType() string{
	return "dog"
}

func showAnimal(animal AnimalIF){
	fmt.Println(animal.GetColor())
	fmt.Println(animal.GetType())
}

func main(){
	var animal AnimalIF
	animal = &Cat{"black"}

	animal.Sleep()
	fmt.Println(animal.GetColor(),animal.GetType())

	showAnimal(animal)

	animal = &Dog{"yellow"}
	fmt.Println(animal.GetColor(),animal.GetType())

	showAnimal(animal)

}